/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Beans;

import Entidades.Address;
import Entidades.Client;
import Entidades.Item;
import Entidades.Orderes;
import Entidades.Product;
import Entidades.Supply;
import Util.Utilitarioxml.XMLunmarshalling;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 *
 * @author Patricio-Pc
 */
@ManagedBean(name = "aplSalvarXMLForBancoController")
@SessionScoped
public class InterfaceXMLController implements Serializable {

    @EJB
    private SessionBeans.ClientFacade EjbFacedeClient;
    @EJB
    private SessionBeans.ItemFacade EjbFacedeItem;
    @EJB
    private SessionBeans.OrderesFacade EjbFacedeOrder;
    @EJB
    private SessionBeans.ProductFacade EjbFacedeProduct;
    @EJB
    private SessionBeans.SoftwareFacade EjbFacedeSW;
    @EJB
    private SessionBeans.HardwareFacade EjbFacedeHD;
    @EJB
    private SessionBeans.AddressFacade EjbFacedeAddress;
    @EJB
    private SessionBeans.SupplyFacade EjbFacedeSupply;
    private List<Orderes> listItens = null;
    private String pathDiretorio = null;
    private List<File> listaArquivoDiretorio = null;
    
    
    /**
     * @see @param pathDiretorio diretorio de onde se deseja ler os arquivos
     */
    public InterfaceXMLController() {
    }

    /**
     * retorna a lista de ordem
     */
    private List<Orderes> getItens(List<File> listaArquivoDiretorio) throws IOException {
        List<Orderes> listOrdes = new ArrayList<>();

        for (File file : listaArquivoDiretorio) {
            XMLunmarshalling c;
            try {
                c = new XMLunmarshalling(file);
                listOrdes.add(c.getPedido());
            } catch (Exception ex) {
                Logger.getLogger(InterfaceXMLController.class.getName()).log(Level.SEVERE, null, ex);
            }
           
        }

        return listOrdes;
    }

    /**
     * retorna a lista de arquivo xml de um diretorio
     */
    private List<File> getFiles(String pathDiretorio) {
        File dir = new File(pathDiretorio);
        List<File> listFiles = new ArrayList<>();

        FileFilter filtro = new FileFilter() {
            @Override
            public boolean accept(File pathname) {

                return true;
            }
        };

        listFiles.addAll(Arrays.asList(dir.listFiles(filtro)));

        return listFiles;
    }

    public List<Orderes> getListItens() {
        return listItens;
    }

    public String getPathDiretorio() {
        return pathDiretorio;
    }

    public List<File> getListaArquivoDiretorio() {
        return listaArquivoDiretorio;
    }

    /**
     * salvar efetivamento no banco de dados os dados dos arquivo
     */
    public void SalvarItensArquivos() throws IOException {
        //this.pathDiretorio = System.getProperty("user.dir") +"\\src\\xml\\";
        this.pathDiretorio = "C:\\WebApplication\\src\\java\\config\\tmp\\";
        System.out.println("this.pathDiretorio");
        this.listaArquivoDiretorio = this.getFiles(this.pathDiretorio);
        this.listItens = getItens(listaArquivoDiretorio);
        System.out.println("this.pathDiretorio passou aqui");
        System.out.println("this.pathDiretorio passou aqui lI: " + listItens);
        System.out.println("this.pathDiretorio passou aqui D: " + listaArquivoDiretorio);
        for (Orderes ordem : this.listItens) {
            System.out.println("this.pathDiretorio passou aqui 2");
            for (Item item : ordem.getItem()) {
                this.salvarItem(item);
            }
            this.salvarCliente(ordem.getClient());
            EjbFacedeOrder.create(ordem);
        }

        this.deletarArquivos(this.listaArquivoDiretorio);

        //return this.listItens;
    }

    private void salvarCliente(Client obj) {

        assert obj != null;

        this.salvarEndereco(obj.getAddress());
        if (obj.getId() == null || EjbFacedeClient.find(obj.getId()) == null) {
            EjbFacedeClient.create(obj);
        }
    }

    private void salvarEndereco(Address obj) {

        assert obj != null;

        if (obj.getID() == null || EjbFacedeAddress.find(obj.getID()) == null) {
            EjbFacedeAddress.create(obj);
        }
    }

    private void salvarProduto(Product obj) {
        assert obj != null;

        this.salvarSupply(obj.getSupply());
        if (obj.getID() == null || EjbFacedeProduct.find(obj.getID()) == null) {
            EjbFacedeProduct.create(obj);
        }
    }

    private void salvarItem(Item obj) {
        assert obj != null;

        this.salvarProduto(obj.getProduct());
        if (obj.getID() == null || EjbFacedeItem.find(obj.getID()) == null) {
            EjbFacedeItem.create(obj);
        }
    }

    private void salvarSupply(Supply obj) {
        assert obj != null;

        this.salvarEndereco(obj.getAddress());

        if (obj.getID() == null || EjbFacedeSupply.find(obj.getID()) == null) {
            EjbFacedeSupply.create(obj);
        }
    }

    /**
     * deletar a lista de arquivos
 *
     */
    private void deletarArquivos(List<File> listaArquivoDiretorio) {
        for (File file : listaArquivoDiretorio) {
            file.delete();
        }
       
    }
}
